# 从 Django 的 utils.deprecation 模块中导入了 MiddlewareMixin 类。在 Django 中，自定义中间件类通常需要继承自这个 MiddlewareMixin 类，
# 它提供了中间件相关的基础功能和规范，使得自定义中间件能够按照 Django 的请求 / 响应处理流程正确地嵌入并发挥作用。
from django.utils.deprecation import MiddlewareMixin
# 导入了 render 和 redirect 函数，不过在这个中间件类中，render 函数并没有实际被用到，redirect 函数用于实现页面重定向操作，
from django.shortcuts import render,redirect
# 定义了一个名为 UserMiddleware 的类，并且继承自 MiddlewareMixin，通过继承具备了中间件的基本属性和能被 Django 识别并应用到请求处理流程中的能力。
class UserMiddleware(MiddlewareMixin):
    # 在 Django 接收到请求但还未调用具体的视图函数之前被调用，主要用于进行请求的预处理，在这里重点是对用户登录状态进行验证，
    # 根据请求的路径以及用户是否登录来决定是放行请求还是重定向到登录页面。
    def process_request(self, request):
        # 首先通过 request.path_info 获取当前请求的路径信息，并赋值给变量 path。
        path = request.path_info
        # 接着判断请求的路径是否为登录页面（/app/login/）或者注册页面（/app/register/），如果是这两个页面中的任意一个，
        # 说明用户访问的是不需要登录就能访问的页面，直接返回 None，表示允许请求继续往后处理，后续会调用对应的视图函数来处理该请求
        if path == '/app/login/' or path == '/app/register/':
            return None
        else:
            # 如果请求的路径不是登录页和注册页，那就需要检查用户是否已经登录，通过 request.session.get('username') 尝试从会话中获取用户名，
            if not request.session.get('username'):
                # 如果获取不到（即返回值为 False 或者 None，意味着用户未登录），则使用 redirect 函数将用户重定向到登录页面（/app/login/），
                # 从而强制用户先登录才能访问其他页面；
                return redirect('/app/login/')
            else:
                # 如果能获取到用户名，说明用户已经登录，同样返回 None，允许请求继续传递给后续的视图函数进行处理。
                return None

    # 在 process_request 方法执行完后，Django 确定了要调用的视图函数，但还未真正调用该视图函数时被调用，这个方法可以用于在视图函数执行前对请求、
    # 视图函数本身以及视图函数的参数等进行一些额外的处理或者验证等操作，
    def process_view(self,request,callback,callback_args,callback_kwargs):
        pass
    # 在视图函数执行完毕，生成了响应对象（response）之后被调用，主要用于对响应进行一些后处理操作
    # 在当前的代码实现中，此方法只是简单地将接收到的响应对象原封不动地返回，也就是没有对响应进行任何额外的处理，
    # 保持视图函数生成的原始响应内容不变，直接传递回客户端（如浏览器）。
    def process_response(self,request,response):
        return response